package com.future.mashibing.class02;

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * 内部是堆结构
 */
public class Code04_PriorityQueue {

    /**
     * peek()--读，只是读
     * poll()--弹出读
     *
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("小根堆开始");
        test();
        System.out.println("小根堆结束");
        System.out.println("大根堆开始");
        // 自定义的大根堆，使用方法
        PriorityQueue<Integer> heap = new PriorityQueue<>(new MyComparator());
        heap.add(6);
        heap.add(2);
        heap.add(3);
        heap.add(1);
        heap.add(66);
        // 读
        System.out.println(heap.peek());
        System.out.println("===");
        // 弹出读
        System.out.println(heap.poll());
        while (!heap.isEmpty()) {
            System.out.println(heap.poll());
        }
    }

    /**
     * 默认小根堆
     */
    private static void test() {
        // 优先级队列
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        heap.add(6);
        heap.add(2);
        heap.add(3);
        heap.add(1);
        heap.add(66);
        // 读
        System.out.println(heap.peek());
        System.out.println("===");
        // 弹出读
        System.out.println(heap.poll());
        while (!heap.isEmpty()) {
            System.out.println(heap.poll());
        }
    }

    /**
     * 默认小根堆，自定义一个大根堆
     */
    public static class MyComparator implements Comparator<Integer> {

        /**
         * 负数：第一个在前
         * 正数：第二个在前
         * 0：谁在前都行
         *
         * @param o1
         * @param o2
         * @return
         */
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 < o2) {
                return 1;
            } else if (o1 > o2) {
                return -1;
            } else {
                return 0;
            }
        }
    }
}
